#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
int n, m, Q;
vector<int>p[N];

int Num[N];
bool ans[N];
struct node {
	int x, y, p, id;
};
vector<node>G[N];

int c[N * 4], tag[N * 4];
void pushup(int u) {
	c[u] = max(c[u * 2], c[u * 2 + 1]);
}
void maketag(int u, int x) {
	c[u] += x;
	tag[u] += x;
}
void pushdown(int u) {
	if(!tag[u]) return;
	maketag(u * 2, tag[u]);
	maketag(u * 2 + 1, tag[u]);
	tag[u] = 0;
}
void update(int u, int L, int R, int l, int r, int x) {
	if(r < L || R < l) return;
	if(l <= L && R <= r) {
		maketag(u, x);
		return;
	}
	pushdown(u);
	int mid = (L + R) / 2;
	update(u * 2, L, mid, l, r, x);
	update(u * 2 + 1, mid + 1, R, l, r, x);
	pushup(u);
}
int query(int u, int L, int R, int l, int r) {
	if(r < L || R < l) return 0;
	if(l <= L && R <= r) return c[u];
	pushdown(u);
	int mid = (L + R) / 2;
	return max(query(u * 2, L, mid, l, r), query(u * 2 + 1, mid + 1, R, l, r));
}
void Sub() {
	for(int i = 1, x, y, p; i <= Q; i++) {
		cin >> x >> y >> p;
		G[x].push_back((node){x, y, p, i});
	}
	for(int i = 1, c, d; i <= m; i++) {
		cin >> c >> d;
		Num[c] = max(Num[c], d);
	}
	for(int i = n; i >= 1; i--) {
		if(i != n) update(1, 1, n, i + 1, n, -1);
		update(1, 1, n, i, i, Num[i]);
		for(int j = 0; j < G[i].size(); j++) {
			node now = G[i][j];
			int P = max(now.p, query(1, 1, n, i, min(n, i + now.p)));
			if(P >= now.x - now.y) ans[now.id] = 1;
		}
	}
	for(int i = 1; i <= Q; i++) {
		if(ans[i]) cout << "YES\n";
		else cout << "NO\n";
	}
}
signed main() {
	freopen("shu.in", "r", stdin);
	freopen("shu.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m >> Q;
	bool flag = 1;
	for(int i = 1, u, v; i < n; i++) {
		cin >> u >> v;
		p[u].push_back(v);
		p[v].push_back(u);
		if(u != i || v != i + 1) flag = 0;
	}
//	if(flag) {
		Sub();
		return 0;
//	}
	
	return 0;
}
/*
6 1 1
1 2
2 3
3 4
4 5
5 6
5 2 2
6 4
*/

